home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / OpenBSD / comp21.tar.gz / comp21.tar / usr / include / machine / pmap.h < prev    next >
C/C++ Source or Header  |  1997-01-16  |  5KB  |  148 lines

  1. /*    $OpenBSD: pmap.h,v 1.2 1997/01/16 09:26:01 niklas Exp $    */
  2. /*    $NetBSD: pmap.h,v 1.16 1995/09/29 13:52:08 chopps Exp $    */
  3.  
  4. /* 
  5.  * Copyright (c) 1987 Carnegie-Mellon University
  6.  * Copyright (c) 1991 Regents of the University of California.
  7.  * All rights reserved.
  8.  *
  9.  * This code is derived from software contributed to Berkeley by
  10.  * the Systems Programming Group of the University of Utah Computer
  11.  * Science Department.
  12.  *
  13.  * Redistribution and use in source and binary forms, with or without
  14.  * modification, are permitted provided that the following conditions
  15.  * are met:
  16.  * 1. Redistributions of source code must retain the above copyright
  17.  *    notice, this list of conditions and the following disclaimer.
  18.  * 2. Redistributions in binary form must reproduce the above copyright
  19.  *    notice, this list of conditions and the following disclaimer in the
  20.  *    documentation and/or other materials provided with the distribution.
  21.  * 3. All advertising materials mentioning features or use of this software
  22.  *    must display the following acknowledgement:
  23.  *    This product includes software developed by the University of
  24.  *    California, Berkeley and its contributors.
  25.  * 4. Neither the name of the University nor the names of its contributors
  26.  *    may be used to endorse or promote products derived from this software
  27.  *    without specific prior written permission.
  28.  *
  29.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  30.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  31.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  32.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  33.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  34.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  35.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  36.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  37.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  38.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  39.  * SUCH DAMAGE.
  40.  *
  41.  *    @(#)pmap.h    7.6 (Berkeley) 5/10/91
  42.  */
  43. #ifndef    _MACHINE_PMAP_H_
  44. #define    _MACHINE_PMAP_H_
  45.  
  46. /*
  47.  * Pmap stuff
  48.  */
  49. struct pmap {
  50.     pt_entry_t        *pm_ptab;    /* KVA of page table */
  51.     st_entry_t        *pm_stab;    /* KVA of segment table */
  52.     int            pm_stchanged;    /* ST changed */
  53.     int            pm_stfree;    /* 040: free lev2 blocks */
  54.     u_int            *pm_stpa;    /* 040: ST phys addr */
  55.     short            pm_sref;    /* segment table ref count */
  56.     short            pm_count;    /* pmap reference count */
  57.     long            pm_ptpages;    /* more stats: PT pages */
  58.     simple_lock_data_t    pm_lock;    /* lock on pmap */
  59.     struct pmap_statistics    pm_stats;    /* pmap statistics */
  60. };
  61.  
  62. typedef struct pmap    *pmap_t;
  63.  
  64. /*
  65.  * On the 040 we keep track of which level 2 blocks are already in use
  66.  * with the pm_stfree mask.  Bits are arranged from LSB (block 0) to MSB
  67.  * (block 31).  For convenience, the level 1 table is considered to be
  68.  * block 0.
  69.  *
  70.  * MAX[KU]L2SIZE control how many pages of level 2 descriptors are allowed.
  71.  * for the kernel and users.  16 implies only the initial "segment table"
  72.  * page is used.  WARNING: don't change MAXUL2SIZE unless you can allocate
  73.  * physically contiguous pages for the ST in pmap.c!
  74.  */
  75. #define    MAXKL2SIZE    32
  76. #define MAXUL2SIZE    16
  77. #define l2tobm(n)    (1 << (n))
  78. #define    bmtol2(n)    (ffs(n) - 1)
  79.  
  80. /*
  81.  * Macros for speed
  82.  */
  83. #define PMAP_ACTIVATE(pmapp, pcbp, iscurproc) \
  84.     if ((pmapp) != NULL && (pmapp)->pm_stchanged) { \
  85.         (pcbp)->pcb_ustp = \
  86.             amiga_btop((vm_offset_t)(pmapp)->pm_stpa); \
  87.         if (iscurproc) \
  88.             loadustp((pcbp)->pcb_ustp); \
  89.         (pmapp)->pm_stchanged = FALSE; \
  90.     }
  91. #define PMAP_DEACTIVATE(pmapp, pcbp)
  92.  
  93. /*
  94.  * For each vm_page_t, there is a list of all currently valid virtual
  95.  * mappings of that page.  An entry is a pv_entry_t, the list is pv_table.
  96.  */
  97. typedef struct pv_entry {
  98.     struct pv_entry    *pv_next;    /* next pv_entry */
  99.     struct pmap    *pv_pmap;    /* pmap where mapping lies */
  100.     vm_offset_t    pv_va;        /* virtual address for mapping */
  101.     u_int        *pv_ptste;    /* non-zero if VA maps a PT page */
  102.     struct pmap    *pv_ptpmap;    /* if pv_ptste, pmap for PT page */
  103.     int        pv_flags;    /* flags */
  104. } *pv_entry_t;
  105.  
  106. #define    PV_CI        0x01    /* all entries must be cache inhibited */
  107. #define PV_PTPAGE    0x02    /* entry maps a page table page */
  108.  
  109. struct pv_page;
  110.  
  111. struct pv_page_info {
  112.     TAILQ_ENTRY(pv_page) pgi_list;
  113.     struct pv_entry *pgi_freelist;
  114.     int pgi_nfree;
  115. };
  116.  
  117. /*
  118.  * This is basically:
  119.  * ((NBPG - sizeof(struct pv_page_info)) / sizeof(struct pv_entry))
  120.  */
  121. #define    NPVPPG    340
  122.  
  123. struct pv_page {
  124.     struct pv_page_info pvp_pgi;
  125.     struct pv_entry pvp_pv[NPVPPG];
  126. };
  127.  
  128. #ifdef    _KERNEL
  129. pv_entry_t    pv_table;    /* array of entries, one per page */
  130. u_int        *Sysmap;
  131. char        *vmmap;        /* map for mem, dumps, etc. */
  132. struct pmap    kernel_pmap_store;
  133.  
  134. #ifdef MACHINE_NONCONTIG
  135. #define pa_index(pa)        pmap_page_index(pa)
  136. #else
  137. #define pa_index(pa)        atop(pa - vm_first_phys)
  138. #endif
  139. #define pa_to_pvh(pa)        (&pv_table[pa_index(pa)])
  140. #define    pmap_kernel()        (&kernel_pmap_store)
  141. #define    active_pmap(pm) \
  142.     ((pm) == pmap_kernel() || (pm) == curproc->p_vmspace->vm_map.pmap)
  143. #define    pmap_resident_count(pmap)    ((pmap)->pm_stats.resident_count)
  144. #define    pmap_wired_count(pmap)        ((pmap)->pm_stats.wired_count)
  145. #endif    /* _KERNEL */
  146.  
  147. #endif    /* !_MACHINE_PMAP_H_ */
  148.